﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DHQGHN.PM0.Models.Admin;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using DHQGHN.PM0.Common.Attributes;


namespace DHQGHN.PM0.Models.Admin
{
    public class UserModel
    {
        public int ID { get; set; }

        public string ADM_UNIT_ID { get; set; }

        [Required(AllowEmptyStrings = false, ErrorMessage = "Bạn chưa nhập tên người dùng")]
        [Remote("CheckExistUserName", "Users", ErrorMessage = "UserNameExist", HttpMethod = "POST", AdditionalFields = "ID, AppId")]
        [RegularExpression(@"[^<>?!,:;~@#\$%\^\&\*\(\)\+=\[\]\{\}\'\""\\/\|]+", ErrorMessage = "Tên đăng nhập không đúng định dạng")]
        // [RegularExpression(@"[^<>?!.,:;~@#\$%\^\&\*\(\)\+=\[\]\{\}\'\""\\/\|_][a-zA-Z0-9_]+[^<>?!.,:;~@#\$%\^\&\*\(\)\+=\[\]\{\}\'\""\\/\|_]$", ErrorMessage = "Tên người dùng không đúng định dạng")]  
        [StringLength(50, MinimumLength = 5, ErrorMessage = "Tên đăng nhập phải dài từ 5 đến 50 ký tự")]
        [Display(Name = "Tên đăng nhập")]
        public string UserName { get; set; }

        //[Required(AllowEmptyStrings = false, ErrorMessage = "Bạn chưa nhập mật khẩu")]
        //[RegularExpression(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&].{7,}$",
        //    ErrorMessageResourceName = "PasswordNotStrong",
        //    ErrorMessageResourceType = typeof(Resources.Localization))]
        [Display(Name = "Mật khẩu")]
        public string Password { get; set; }

        //[DataType(DataType.Password)]
        //[Display(Name = "Gõ lại mật khẩu")]
        //[System.Web.Mvc.Compare("Password", ErrorMessage = "Mật khẩu xác nhận không chính xác")]
        //public string ConfirmPassword { get; set; }

        [Required(AllowEmptyStrings = false, ErrorMessage = "Bạn chưa nhập họ tên đầy đủ")]
        [StringLength(100, ErrorMessage = "Độ dài tối đa là 100 ký tự")]
        [Display(Name = "Tên đầy đủ")]
        [RegularExpression(@"[^<>?!.,:;~@#\$%\^\&\*\(\)\+=\[\]\{\}\'\""\\/\|_]+",
           ErrorMessage = "Họ tên không đúng định dạng")]
        public string FullName { get; set; }

        public string RegDate { get; set; }

        [Required(AllowEmptyStrings = false, ErrorMessage = "Bạn chưa nhập Email")]
        [RegularExpression(@"^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$",
        ErrorMessage = "Email không đúng định dạng")]
        [Remote("CheckEmail", "Users", ErrorMessage = "Email này đã tồn tại. Vui lòng nhập EMail khác", HttpMethod = "POST")]
        public string Email { get; set; }

        public int RecordCount { get; set; }
        public List<MenuModel> ListMenu { get; set; }
        public int IsActive { get; set; }
        public int Status { get; set; }
        public List<RoleModel> ListRole { get; set; }
        public List<GroupModel> ListGroup { get; set; }
        public string AppCode { get; set; }
        public int LoginTime { get; set; }
        [Required(AllowEmptyStrings = false, ErrorMessageResourceName = "Error_HaventPutAppNameYet", ErrorMessageResourceType = typeof(Resources.Localization))]
        [LocalizationDisplay("AppName")]
        [Range(1, int.MaxValue, ErrorMessageResourceName = "Error_HaventPutAppNameYet", ErrorMessageResourceType = typeof(Resources.Localization))]
        public int AppId { get; set; }

        public UserModel() { }

        public UserModel(DAL.Models.Admin.UserModel u)
        {
            // TODO: Complete member initialization
            ID = u.ID;
            UserName = u.UserName;
            Password = u.Password;
            RegDate = u.RegDate;
            Email = u.Email;
            FullName = u.FullName;
            IsActive = u.IsActive;
            Status = u.Status;
            ADM_UNIT_ID = u.ADM_UNIT_ID;
            AppId = u.AppId;
            RecordCount = u.RecordCount;
            this.AppCode = u.AppCode;
            this.LoginTime = u.LoginTime;
            this.ListMenu = new List<MenuModel>();
            if (u.ListMenu != null)
            {
                foreach (DHQGHN.DAL.Models.Admin.MenuModel m in u.ListMenu)
                {
                    this.ListMenu.Add(new MenuModel
                    {
                        MenuCode = m.MenuCode,
                        MenuId = m.MenuId,
                        MenuUrl = m.MenuUrl,
                        MenuName = m.MenuName,
                        ParentMenuId = m.ParentMenuId
                    });
                }
            }
            this.ListRole = new List<RoleModel>();
            if (u.ListRole != null)
            {
                foreach (DHQGHN.DAL.Models.Admin.RoleModel r in u.ListRole)
                {
                    this.ListRole.Add(new RoleModel
                    {
                        RoleId = r.RoleId,
                        RoleName = r.RoleName,
                        RoleCode = r.RoleCode,
                        RoleDescription = r.RoleDescription
                    });
                }
            }
            this.ListGroup = new List<GroupModel>();
            if (u.ListGroup != null)
            {
                foreach (DHQGHN.DAL.Models.Admin.GroupModel g in u.ListGroup)
                {
                    this.ListGroup.Add(new GroupModel
                    {
                        GroupId = g.GroupId,
                        GroupName = g.GroupName,
                        GroupCode = g.GroupCode,
                        Description = g.Description
                    });
                }
            }
        }

        internal DAL.Models.Admin.UserModel toDALModel()
        {
            DAL.Models.Admin.UserModel appModel = new DAL.Models.Admin.UserModel
            {
                ID = ID,
                UserName = UserName,
                Password = Password,
                RegDate = RegDate,
                Email = Email,
                FullName = FullName,
                IsActive = IsActive,
                Status = Status,
                ADM_UNIT_ID = ADM_UNIT_ID,
                AppId = AppId,
                RecordCount = RecordCount
            };
            return appModel;
        }
    }
}